package com.api.common.alert;

import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 告警系统使用示例
 * 展示如何使用指定邮箱的告警功能
 */
//@Component
public class AlertUsageExample {

    @Resource
    private CommonAlertHelper alertHelper;

    /**
     * 示例1：使用默认告警（发送到所有启用的渠道）
     */
    public void example1_DefaultAlert() {
        // API故障告警 - 发送到所有启用的告警渠道（邮件、钉钉等）
        alertHelper.apiFailure("getUserInfo", "数据库连接超时", 3);
        
        // 接口下线告警 - 发送到所有启用的告警渠道
        alertHelper.interfaceOffline(1001L, "天气查询接口", "接口提供商服务异常");
    }

    /**
     * 示例2：指定邮箱发送告警
     */
    public void example2_EmailSpecificAlert() {
        // API故障告警 - 只发送到指定邮箱
        alertHelper.apiFailure("getUserInfo", "数据库连接超时", 3, "admin@example.com");
        
        // 接口下线告警 - 只发送到指定邮箱
        alertHelper.interfaceOffline(1001L, "天气查询接口", "接口提供商服务异常", "ops@example.com");
        
        // 支付失败告警 - 只发送到指定邮箱
        alertHelper.paymentFailure("ORDER-20231101-001", 12345L, 99.99, "余额不足", "finance@example.com");
    }

    /**
     * 示例3：根据业务场景动态选择告警方式
     */
    public void example3_DynamicAlert(long userId, String userEmail) {
        // 根据用户信息决定是否发送个人邮箱告警
        String toEmail = null;
        if (isVipUser(userId)) {
            // VIP用户发送到个人邮箱
            toEmail = userEmail;
        }
        
        // 接口配额耗尽告警
        alertHelper.interfaceQuotaExhausted(userId, 2001L, "图片识别接口", 1000, toEmail);
    }

    /**
     * 示例4：不同级别的告警发送到不同邮箱
     */
    public void example4_LevelBasedAlert() {
        // 严重告警发送给技术负责人
        alertHelper.databaseConnectionFailure("main-db", "连接池耗尽", "tech-lead@example.com");
        
        // 一般告警发送给运维团队
        alertHelper.databaseSlowQuery("SELECT * FROM user WHERE ...", 3000, "ops-team@example.com");
        
        // 业务告警发送给产品经理
        alertHelper.userLoginFailure(12345L, "zhangsan", "密码错误", 5, "pm@example.com");
    }

    /**
     * 示例5：多种告警类型的综合使用
     */
    public void example5_ComprehensiveAlert() {
        // 1. API相关告警
        alertHelper.apiTimeout("paymentService", 5000, "payment-team@example.com");
        alertHelper.apiRateLimit("createOrder", "user-12345", 100, "ops@example.com");
        
        // 2. 线程池相关告警
        alertHelper.threadPoolSaturated("async-pool", 95, 100, "dev-team@example.com");
        alertHelper.threadPoolRejected("task-pool", 50, "tech-lead@example.com");
        
        // 3. 缓存相关告警
        alertHelper.cacheConnectionFailure("redis-master", "连接超时", "ops@example.com");
        
        // 4. MQ相关告警
        alertHelper.mqSendFailure("order-exchange", "order.created", "网络异常", 3, "mq-team@example.com");
        alertHelper.mqConsumeFailure("payment-queue", "msg-123456", "反序列化失败", "dev-team@example.com");
        
        // 5. 网关相关告警
        alertHelper.gatewayRouteFailure("route-001", "http://user-service", "服务不可用", "gateway-team@example.com");
        alertHelper.gatewayCircuitBreakerOpen("payment-service", 0.8, "ops@example.com");
        
        // 6. 风控相关告警
        alertHelper.riskModelFailure("fraud-detection", "模型加载失败", "risk-team@example.com");
        alertHelper.riskHighScore(12345L, "192.168.1.100", 95.5, "异常登录行为", "security@example.com");
        
        // 7. 业务相关告警
        alertHelper.interfaceCallSpike(3001L, "短信发送接口", 1000, 100, "business@example.com");
        alertHelper.interfaceErrorRateHigh(3002L, "支付接口", 0.15, 1000, 150, "payment-team@example.com");
        
        // 8. 订单支付相关告警
        alertHelper.orderCreationFailure(12345L, "VIP会员月卡", "库存不足", "ops@example.com");
        alertHelper.paymentTimeout("ORDER-20231101-002", 12345L, 199.99, 30000, "payment-team@example.com");
    }

    /**
     * 示例6：任务执行中的告警
     */
    public void example6_TaskAlert() {
        // 任务执行失败告警
        alertHelper.taskFailure("数据同步任务", "目标数据库连接失败", "task-team@example.com");
        
        // 任务执行超时告警
        alertHelper.taskTimeout("报表生成任务", 600000, "report-team@example.com");
        
        // 任务被跳过告警
        alertHelper.taskSkipped("定时清理任务", "上一次执行未完成", "ops@example.com");
    }

    /**
     * 示例7：批量告警场景
     */
    public void example7_BatchAlert() {
        // 监控到多个服务出现问题，批量发送告警
        String adminEmail = "admin@example.com";
        
        alertHelper.apiFailure("userService", "服务不可用", 5, adminEmail);
        alertHelper.apiFailure("orderService", "服务不可用", 5, adminEmail);
        alertHelper.apiFailure("paymentService", "服务不可用", 5, adminEmail);
    }

    // 辅助方法
    private boolean isVipUser(long userId) {
        // 判断是否为VIP用户的逻辑
        return userId % 10 == 0;
    }
}

